#ifndef CSCHPROCESSPOSITION_H
#define CSCHPROCESSPOSITION_H

#include "cjgboxdata.h"
#include "cjgpositionmanager.h"
#include "ctechmanager.h"

#include <QSet>
#include <qtypes.h>

#define _MAX_SCORE_ITEM_	14	//分数的项目总数

class CPreScheduling;

struct SSCHDATAINPUT;

typedef struct _SSCORE
{
    int Version;//数据版本，显示的时候按照最新的版本显示，可以top10000然后遇到低级别的版本就不显示了
    qlonglong ProcessID;//订单工序
    int		  Position;//工位1~60
    double     Total;//总分数，和项目因子相乘后累加
    double     ScoreItem[_MAX_SCORE_ITEM_];//每个项目标准分下的分数
    CJgOrderProcess * pOp;
    QString   remark;
    CJgBoxData * pSendBox;//已发送的筐号
    _SSCORE & operator=(const _SSCORE &rObj);
}SSCORE, *PSSCORE;

struct SSCHPROCESSPOSITION
{
    int Version;//数据版本，与数据库不同则重新获取数据
    QHash<qlonglong/*工序id*/, CJgOrderProcess * /*工序数据指针*/> hProcessSet;//需要进行排产的工序集
    QSet<int> sPositionsCanSend;//可以发送的工位
    QSet<int> sPositionsScore;//可以排产的工位
    QHash<qlonglong/*筐记录id*/, CJgBoxData *> hBoxes;//可用的筐
    QHash<qlonglong/*工序id*/, QVector<SSCORE*>> hScoreByProcess;//按工序查找的分数表，可以对QVector进行降序排序
    QHash<int/*工位*/, QVector<SSCORE*>> hScoreByPosition;//按工位查找的分数表，可以对不同工序进行排序
    QVector<SSCORE*>  Scores;//分数的保持者，前面两个只是为了方便查找和排序，建构和保存和析构以这个为准

    QString FeedBoxNumUSE;//只是用来写入日志
    QString BackBoxNumUSE[2];//只是用来写入日志

    SSCHDATAINPUT * pSchIn;//因为异步保存需要用到输入数据，在这里持有指针，后续可以用 这个结构来管理输入和输出。
};

class CSchProcessPosition
{
public:
    SSCHDATAINPUT * pSchData;
    SSCHPROCESSPOSITION ProcessPosition;
    CJgPositionManager* pPositionManager;
    CTechManager *pTechManger;
    CPreScheduling * preScheduling;

    CSchProcessPosition();
    bool FaKuang_MinSTD(SSCORE * s, QString why);//需要加人后在库工时大于最小人均标准工时才处理
    bool ReCheckCanSend_MinSTD(SSCORE * s, QString &why);//重新确认是否可以发送
    bool RecheckCanSend_WeiChi(SSCORE * s, QString &why);//切换工序前，正在做的工序是不是可以维持不变
    bool RecheckCanSend_QuanBuZaiKu(SSCORE * s, QString &why);
    bool RecheckCanSend_WaitBest(SSCORE * s, QString &why);//切换工序时，检查是否需要等待最好的工序
    bool IsAllUndoInLibAndFew(CJgOrderProcess * pOp);///所有未做工序都在库,且可做工时小于最小在库工时
    void CalculateScore();//计算分数
    void CalculateItem_1(float ratio);//计算最后n筐
    void CalculateItem_2(float ratio);
    void CalculateItem_3(float ratio);
    void CalculateItem_4(float ratio);
    void CalculateItem_5(float ratio);
    void CalculateItem_6(float ratio);
    void CalculateItem_7(float ratio);
    void CalculateItem_8(float ratio);
    void CalculateItem_9(float ratio);
    void CalculateItem_10(float ratio);
    void CalculateItem_11(float ratio);
    void CalculateItem_12(float ratio);
    void CalculateItem_13(float ratio);
    void CalculateItem_14(float ratio);
    
    // 为测试添加的公共访问方法
    const QHash<qlonglong, QVector<SSCORE*>>& getScoreByProcess() const { return ProcessPosition.hScoreByProcess; }
};

#endif // CSCHPROCESSPOSITION_H